const logger = require('../config/logger');

/**
 * Socket.IO 事件处理器
 * @param {Object} io - Socket.IO 服务器实例
 */
module.exports = (io) => {
  // 连接事件
  io.on('connection', (socket) => {
    logger.info(`用户连接: ${socket.id}`);

    // 用户加入房间
    socket.on('join-room', (roomId) => {
      socket.join(roomId);
      logger.info(`用户 ${socket.id} 加入房间 ${roomId}`);
    });

    // 用户离开房间
    socket.on('leave-room', (roomId) => {
      socket.leave(roomId);
      logger.info(`用户 ${socket.id} 离开房间 ${roomId}`);
    });

    // 实时聊天消息
    socket.on('chat-message', (data) => {
      const { roomId, message, userId, username } = data;
      
      // 广播消息到房间内所有用户
      io.to(roomId).emit('chat-message', {
        id: Date.now(),
        message,
        userId,
        username,
        timestamp: new Date().toISOString()
      });
      
      logger.info(`聊天消息 - 房间: ${roomId}, 用户: ${username}`);
    });

    // 在线考试状态同步
    socket.on('exam-status', (data) => {
      const { examId, userId, status } = data;
      
      // 广播考试状态到监考老师
      socket.to(`exam-${examId}-teachers`).emit('student-exam-status', {
        userId,
        status,
        timestamp: new Date().toISOString()
      });
      
      logger.info(`考试状态更新 - 考试: ${examId}, 学生: ${userId}, 状态: ${status}`);
    });

    // 课程直播相关事件
    socket.on('join-live-course', (courseId) => {
      socket.join(`live-course-${courseId}`);
      
      // 通知其他用户有新用户加入
      socket.to(`live-course-${courseId}`).emit('user-joined', {
        userId: socket.userId,
        timestamp: new Date().toISOString()
      });
      
      logger.info(`用户加入直播课程: ${courseId}`);
    });

    // 直播互动消息
    socket.on('live-interaction', (data) => {
      const { courseId, type, content } = data;
      
      // 广播互动消息
      io.to(`live-course-${courseId}`).emit('live-interaction', {
        ...data,
        timestamp: new Date().toISOString()
      });
      
      logger.info(`直播互动 - 课程: ${courseId}, 类型: ${type}`);
    });

    // 系统通知
    socket.on('system-notification', (data) => {
      const { targetUsers, notification } = data;
      
      // 发送给指定用户
      targetUsers.forEach(userId => {
        io.to(`user-${userId}`).emit('notification', {
          ...notification,
          timestamp: new Date().toISOString()
        });
      });
      
      logger.info(`系统通知发送给 ${targetUsers.length} 个用户`);
    });

    // 用户认证
    socket.on('authenticate', (data) => {
      const { userId, token } = data;
      
      // 这里应该验证token的有效性
      // 简化处理，直接设置用户ID
      socket.userId = userId;
      socket.join(`user-${userId}`);
      
      logger.info(`用户认证成功: ${userId}`);
    });

    // 断开连接事件
    socket.on('disconnect', (reason) => {
      logger.info(`用户断开连接: ${socket.id}, 原因: ${reason}`);
      
      // 通知相关房间用户离线
      if (socket.userId) {
        socket.broadcast.emit('user-offline', {
          userId: socket.userId,
          timestamp: new Date().toISOString()
        });
      }
    });

    // 错误处理
    socket.on('error', (error) => {
      logger.error(`Socket错误 - ${socket.id}:`, error);
    });
  });

  // 服务器级别的错误处理
  io.on('error', (error) => {
    logger.error('Socket.IO服务器错误:', error);
  });

  logger.info('Socket.IO 服务器已启动');
};